实体抽取:使用CRF++(1)
本系列文章为珠峰书《知识图谱:认知智能理论与实战》配套的材料
在《知识图谱:认知智能理论与实战》一书中,对实体的定义为:
实体(Entity):是指一种独立的、拥有清晰特征的、能够区别于其他事物的事物。在信息抽取、自然语言处理和知识图谱等领域,用来描述这些事物的信息即实体。实体可以是抽象的或者具体的。
——王文广 《知识图谱:认知智能理论与实战》 P81
这是对1996年MUC-6会议对命名实体的扩展。MUC组委会在当时提出的“命名实体”任务要求从文本中识别出所有的人物名称(人名)、组织机构名称(机构名)和地理位置名称(地名),以及时间、货币和百分数的表述。如果仅仅识别人名、地名、机构名等实体的话,常见的分词库(如 jieba、HanLP、LAC 等)都支持的,可以直接使用这些库来识别,效果通常还不错。
而如果要在产业应用中进行实体抽取,仅仅能够处理这几个命名实体则远远不够。比如书名的识别、建筑物名称的识别、汽车品牌的识别、汽车零部件的识别等等。
在实践中,实体不一定是对物理事物的表述,也可以是对虚拟事物的表述。比如“经济指标”类型的实体“CPI”、人物或者组织机构发表的“观点”类型的实体、某个领域权威人物发表的“言论”类型的实体,在制造业质量和可靠性工程中的“失效事件”类型的实体,以及在各类机械与电子电器设备制造领域中的“性能”类型的实体等。
——王文广 《知识图谱:认知智能理论与实战》 P81
实体抽取就是从一段文本中抽取出符合要求的实体,常见的实体抽取方法非常多,在《知识图谱:认知智能理论与实战》的第三章介绍了主流的几种实体抽取方法。本文介绍了该书3.4.7节《用 CRF++进行实体抽取》的实例。关于 CRF 的原理,参考《知识图谱:认知智能理论与实战》一书 3.4.5节(P102~106)。
CRF++是CRF 的一种最知名且最经典的实现,通过开放源代码发布的,其官网为【https://taku910.github.io/crfpp/】。Linux(如 Ubuntu、CentOS等)、Unix、Mac(Macbook 等)可下载源码CRF++-0.58.tar.gz并编译使用,源码地址为【https://drive.google.com/file/d/0B4y35FiV1wh7QVR6VXJ5dWExSTQ/view?usp=sharing&resourcekey=0-349QIpjajRnmQl3K8JNCeA 或 https://github.com/wgwang/kg-book/raw/main/codes/3.4/CRF%2B%2B-0.58.tar.gz 】。对于 Windows,可下载安装文件CRF++-0.58.zip,其地址为【https://drive.google.com/file/d/0B4y35FiV1wh7d0dGRU5uRjB4dGM/view?usp=sharing&resourcekey=0-_kwhKjfonyclAqy9KJ9YOw 或https://github.com/wgwang/kg-book/raw/main/codes/3.4/CRF%2B%2B-0.58.zip 】。在本书配套的 github仓库【https://github.com/wgwang/kg-book 】 上提供了副本,也可从中下载【https://github.com/wgwang/kg-book/tree/main/codes/3.4 】。有些操作系统带有预编译好的程序,也可以直接使用,具体安装方法可从参考相应的操作系统。下面以Linux 为例。
解压 CRF++源码并进行编译
从源码编译 CRF++非常简单,运行如下命令即可(参考《知识图谱:认知智能理论与实战》清单3-4,P108):
./configure --prefix=/your/install/path
make
make install
有时不方便安装(比如无 root 权限等),那么可以选择编译静态的CRF++程序,参考《知识图谱:认知智能理论与实战》清单3-5,P108。静态编译后,在当前目录找到两个编译好的文件crf_learn 和 crf_test,并复制到指定的目录即可。
./configure LDFLAGS="-static"
make
使用 BIO 标记方法准备训练语料
CRF++所使用的训练语料格式说明如下(《知识图谱:认知智能理论与实战》清单3-6, P108):
多列多行的文本
列的个数固定,除空行外,所有行的列数保持一样,在实体抽取任务中保持两列即可
列之间用空白符(空格或Tab)分隔
每行一个带标记的词元,第一列为词元本身,第二列及其往后为词元标记
可以用空白行表示句子或段落的分隔
进行实体抽取的常用标记方法参考《知识图谱:认知智能理论与实战》第3.4.6节《标记方法》(P106~107),本例子使用 BIO 的标记方法,其语料格式如下所示(《知识图谱:认知智能理论与实战》清单3-7, P108~109):
12 B-DATE
月 I-DATE
17 I-DATE
日 I-DATE
, O
嫦 B-PER
娥 I-PER
五 O
号 O
返 O
回 O
器 O
在 O
内 B-LOC
蒙 I-LOC
古 I-LOC
四 B-LOC
子 I-LOC
王 I-LOC
旗 I-LOC
安 O
全 O
着 O
陆 O
。 O
本例子使用 MSRA 发布的公开命名实体识别的语料,可以从【https://github.com/wgwang/kg-book/tree/main/datasets/NER-MSRA】下载处理好的数据集,包括训练语料train.txt和测试语料test.txt。语料的说明见该目录下的 readme。
配置 CRF++特征模板
在训练语料准备好后,模型训练就“万事俱备,只欠东风”——“特征工程”了。在传统机器学习中,特征工程是指选择合适特征来训练模型,是决定模型效果好坏的最关键的一环。在前文介绍最大熵模型和条件随机场模型的原理解析时提到,特征函数就是依靠特征工程完成的。在CRF++中,特征函数以特征模板的形式体现。因此,使用CRF++进行实体抽取的最核心的工作是构造合适的特征模板。在实践中,往往要根据数据的情况,设计多个特征模板,并根据所训练模型的效果选择其中表现最好的一个。
——王文广 《知识图谱:认知智能理论与实战》 P109
CRF++特征模板的详细解析请查阅书籍《知识图谱:认知智能理论与实战》 P109~111。在本例中使用了如下的特征模板文件(《知识图谱:认知智能理论与实战》一书清单3-9,P110)。模板文件可以从【https://github.com/wgwang/kg-book/raw/main/codes/3.4/tpl】下载。
# Unigram
U01:%x[-2,0]
U02:%x[-1,0]
U03:%x[0,0]
U04:%x[1,0]
U05:%x[2,0]
U06:%x[-2,0]/%x[-1,0]/%x[0,0]
U07:%x[-1,0]/%x[0,0]/%x[1,0]
U08:%x[0,0]/%x[1,0]/%x[2,0]
U09:%x[-1,0]/%x[0,0]
U10:%x[0,0]/%x[1,0]
# Bigram
B
训练一个实体抽取模型
下述命令用于训练一个实体抽取模型。其中:
lcrf_learn是CRF++用来训练模型的程序,如果在当前用户的路径中的话,则不需要“./”;
l参数tpl是特征模板文件,可以将前述文件复制到空的文本文件中,或者从【】下载;
ltrain.txt是训练语料,可以从【https://github.com/wgwang/kg-book/raw/main/datasets/NER-MSRA/train.txt】下载并保存为文件名“train.txt”;,
lmodel-crf是crf_learn输出的训练好的模型文件的文件名,可以自行取名。
.
/crf_learn -a CRF -p 32 ./tpl ./train.txt model-crf
# 或
crf_learn -a CRF -p 32 ./tpl ./train.txt model-crf
训练过程中,crf_learn会输出一些信息,比如:
iter=363 terr=0.00020 serr=0.00502 act=25411498 obj=18979.07784 diff=0.00008
iter=364 terr=0.00020 serr=0.00499 act=25411498 obj=18978.06300 diff=0.00005
iter=365 terr=0.00020 serr=0.00490 act=25411498 obj=18976.57020 diff=0.00008
其中,iter表示迭代次数,terr表示标签级错误比例(错误的标签/所有的标签),serr表示句子级别的错误比例(错误的句子数量/全部句子数量,句子在训练语料中用空白行隔开),其他参数可参考CRF++的文档。训练完成后,会生成模型文件model-crf。crf_test使用该模型来进行实体抽取。
使用训练好的模型来抽取实体
上述训练模型的过程完成后,即可使用 crf_test 来预测。预测时仅有一列,每行一个字符。比如(可以从【https://github.com/wgwang/kg-book/raw/main/codes/3.4/predict.txt】下载):
《
知
识
图
谱
:
认
知
智
能
理
论
与
实
战
》
一
书
作
者
为
王
文
广
,
由
电
子
工
业
出
版
社
出
版
将上述内容保存为“predict.txt”,使用下述命令:
crf_test -m model-crf predict.txt
即可得到预测的结果:
《 O
知 O
识 O
图 O
谱 O
:O
认 O
知 O
智 O
能 O
理 O
论 O
与 O
实 O
战 O
》 O
一 O
书 O
作 O
者 O
为 O
王 B-PER
文 I-PER
广 I-PER
, O
由 O
电 B-ORG
子 I-ORG
工 I-ORG
业 I-ORG
出 I-ORG
版 I-ORG
社 I-ORG
出 O
版 O
从结果中可以看出,模型正确地识别出了“王文广”为“PER(人物)” 类型的实体,识别出了“电子工业出版社”为“ORG(机构)”类型的实体。
参考材料
l王文广. 知识图谱:认知智能理论与实战[M]. 北京:电子工业出版社, 2022: P108
lCRF++官方文档:https://taku910.github.io/crfpp/#usage
l本文代码及数据可从https://github.com/wgwang/kg-book上获取